home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’97 / Animated Icons / Source / AnimatedIcons.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-30  |  13.3 KB  |  378 lines  |  [TEXT/CWIE]

  1. #include <Icons.h>
  2. #include <LArray.h>
  3. #include <Movies.h>
  4. #include <stdlib.h>
  5. #include <new.h>
  6. #include <speech.h>
  7.  
  8. //    ============================================================================================
  9.  
  10. #define kRectMask 3
  11. #define kIconsRect 0
  12. #define kParentRect 1
  13. #define kDontDraw 2
  14. #define kSpareRectMode 3
  15.  
  16. #define kPlaySound 4
  17. #define kMouseTriger 8
  18. #define kPlayTone 0x00000010
  19.  
  20. //    ============================================================================================
  21.  
  22. extern unsigned long gNextTickToCheckAnimations;
  23. extern LArray*    gIconsToAnimate;
  24. extern LArray*    gIconsOnScreen;
  25.  
  26. //    ============================================================================================
  27.  
  28. class AnimatedIconOnScreen;
  29.  
  30. class AnimatedIcon
  31. {
  32. public:
  33.                             AnimatedIcon ( void* iconSuiteToReplace );
  34.     virtual                    ~AnimatedIcon ();
  35.     
  36.     void*                    GetIconSuiteThisReplaces() const { return mIconSuiteWeAreReplacing; };
  37.  
  38.     static    AnimatedIcon*    GetAnimatedIconForIconSuite ( void* iconSuite );
  39.  
  40.     virtual AnimatedIconOnScreen*    GetNewAnimatedIconOnScreen (  GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform ) = 0;
  41.  
  42.     void*                    operator new ( size_t s ) { return NewPtrSysClear ( s ); };
  43.     void                    operator delete ( void* p ) { if ( p ) DisposePtr( (Ptr) p ); };
  44.  
  45. protected:
  46.     friend class AnimatedIconOnScreen;
  47.     void*                    mIconSuiteWeAreReplacing;
  48. };
  49.  
  50. //    ============================================================================================
  51.  
  52. class AnimatedIconOnScreen
  53. {
  54. public:
  55.                             AnimatedIconOnScreen ( AnimatedIcon* animatedIcon, GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  56.                             ~AnimatedIconOnScreen ( );
  57.                             
  58.     virtual void            Advance ( ) { };
  59.     virtual void             BeginAnimation ( GrafPtr /* port */, const Rect* /* rect */ ) { };
  60.     virtual OSErr            Draw ( const Rect* rect, IconAlignmentType align, IconTransformType transform ) = 0;
  61.     virtual unsigned long    Idle () { return 0; };
  62.  
  63.     unsigned long            GetNextAnimationTick ( ) const { return mNextAnimationTick; };
  64.  
  65.     AnimatedIcon*            GetAnimatedIcon ( ) const { return mAnimatedIcon; };
  66.     GrafPtr                    GetPort ( ) const { return mPort; };
  67.     Rect                    GetRect ( ) const { return mRect; };
  68.     IconAlignmentType         GetAlign ( ) const { return mAlign; };
  69.     IconTransformType        GetTransform() const { return mTransform; };
  70.     RgnHandle                GetRgn ( ) const { return mIconRgn; };
  71.     
  72.     virtual void            SetRect ( const Rect& r ) { mRect = r; RectRgn ( mIconRgn, & mRect ); };
  73.     virtual void            SetPort ( GrafPtr newPort ) { mPort = newPort; mBitMap = & newPort->portBits; };
  74.     BitMap*                    GetBitMap () const { return mBitMap; };
  75.             
  76.     void*                    operator new ( size_t s ) { return NewPtrSysClear ( s ); };
  77.     void                    operator delete ( void* p ) { if ( p ) DisposePtr( (Ptr) p ); };
  78.  
  79.     unsigned long            GetCountOfTimesThisHasBeenInvalidated ( ) const { return mInvalidatedCount; };
  80.     void                    IncrementCountOfTimesThisHasBeenInvalidated ( ) { mInvalidatedCount++; };
  81.         
  82.     static AnimatedIconOnScreen* GetAnimatedIconOnScreen ( GrafPtr inPort, const Rect& r, void* iconSuiteH );
  83.  
  84. protected:
  85.     AnimatedIcon*            mAnimatedIcon;
  86.     GrafPtr                    mPort;
  87.     Rect                    mRect;
  88.     IconAlignmentType         mAlign;
  89.     IconTransformType        mTransform;
  90.     unsigned long            mNextAnimationTick;
  91.     RgnHandle                mIconRgn;
  92.     
  93.     unsigned long            mInvalidatedCount;
  94.     BitMap*                    mBitMap;
  95. };
  96.  
  97. //    ============================================================================================
  98.  
  99. class FrameAnimatedIconOnScreen;
  100.  
  101. class FrameAnimatedIcon : public AnimatedIcon
  102. {
  103.     typedef struct FrameAnimatedIconResourceStruct
  104.     {
  105.         OSType            signature;
  106.         unsigned long    version;
  107.         
  108.         unsigned long    ticksPerAnimationCycle;
  109.         
  110.         unsigned short    countOfAnimatedIcons;
  111.         short            icons[1];    //    really variable size
  112.     } FrameAnimatedIconResourceStruct, *FrameAnimatedIconResourcePtr, **FrameAnimatedIconResourceHandle;
  113.  
  114. public:
  115.                             FrameAnimatedIcon ( void* iconSuiteToReplace, FrameAnimatedIconResourceHandle aicnHandle );
  116.                             ~FrameAnimatedIcon ();
  117.  
  118.     virtual AnimatedIconOnScreen*    GetNewAnimatedIconOnScreen ( GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  119.  
  120. protected:
  121.     friend class FrameAnimatedIconOnScreen;
  122.  
  123.     static pascal OSErr        DetachIconResource ( OSType resType, Handle* iconHandle, void* yourDataPtr );
  124.     
  125.     unsigned long        mTicksPerAnimationCycle;
  126.     
  127.     unsigned long        mCountOfAnimatedIcons;
  128.     Handle                mAnimatedIcons[32];
  129. };
  130.  
  131. //    ============================================================================================
  132.  
  133. class FrameAnimatedIconOnScreen : public AnimatedIconOnScreen
  134. {
  135. public:
  136.                             FrameAnimatedIconOnScreen (  AnimatedIcon* animatedIcon, GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  137.                             ~FrameAnimatedIconOnScreen ( );
  138.                                             
  139.     virtual void            Advance ( );
  140.     virtual OSErr            Draw ( const Rect* rect, IconAlignmentType align, IconTransformType transform );
  141.     virtual unsigned long     Idle ( );
  142.  
  143.     virtual unsigned long    GetTicksPerFrame ( ) const { return mTicksPerAnimationCycle; };
  144.     virtual unsigned long    GetFrameCount ( ) const { return mCountOfAnimatedIcons; };
  145.     Handle                    GetFrameIconSuiteHandle ( unsigned long i ) const { if ( i < mCountOfAnimatedIcons ) return GetParent()->mAnimatedIcons[i]; return nil; };
  146.  
  147. protected:
  148.     FrameAnimatedIcon*        GetParent ( ) const { return (FrameAnimatedIcon*) mAnimatedIcon; };
  149.     
  150.     unsigned long            mTicksPerAnimationCycle;
  151.     unsigned long            mCountOfAnimatedIcons;
  152.     unsigned long            mFrame;    
  153. };
  154.  
  155. inline AnimatedIconOnScreen* FrameAnimatedIcon::GetNewAnimatedIconOnScreen ( GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform )
  156. {    
  157.     return new FrameAnimatedIconOnScreen ( this, port, rect, align, transform );
  158. }
  159.  
  160. //    ============================================================================================
  161.  
  162. class QuicktimeMovieAnimatedIcon : public AnimatedIcon
  163. {
  164.     typedef struct QuicktimeMovieAnimatedIconnResourceStruct
  165.     {
  166.         OSType            signature;
  167.         unsigned long    version;        
  168.         unsigned long    flags;
  169.         
  170.     } QuicktimeMovieAnimatedIconResourceStruct, *QuicktimeMovieAnimatedIconResourcePtr, **QuicktimeMovieAnimatedIconResourceHandle;
  171.  
  172. public:
  173.                         QuicktimeMovieAnimatedIcon ( void* iconSuiteToReplace, QuicktimeMovieAnimatedIconResourceHandle h, const FSSpec* spec, short movieResID );
  174.                         ~QuicktimeMovieAnimatedIcon ();
  175.  
  176.     virtual AnimatedIconOnScreen*    GetNewAnimatedIconOnScreen ( GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  177.  
  178.     static Boolean            IsQuicktimeAvailable();
  179.                         
  180. protected:
  181.     friend class QuicktimeMovieAnimatedIconOnScreen;
  182.     
  183.     unsigned long        mMovieFlags;
  184.     Movie                mMovie;
  185.     short                mMovieResFileNum;
  186.  
  187.     
  188.     static Boolean            sEnterMoviesCalledByUs;
  189.     static Boolean            sQuickTimeAvailableAndInitialized;
  190. };
  191.  
  192. //    ============================================================================================
  193.  
  194. class QuicktimeMovieAnimatedIconOnScreen : public AnimatedIconOnScreen
  195. {
  196. public:
  197.                             QuicktimeMovieAnimatedIconOnScreen ( AnimatedIcon* animatedIcon, GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  198.                             ~QuicktimeMovieAnimatedIconOnScreen ( );
  199.                             
  200.     virtual OSErr            Draw ( const Rect* rect, IconAlignmentType align, IconTransformType transform );
  201.     virtual unsigned long    Idle ();
  202.  
  203.     virtual void            SetRect ( const Rect& r );
  204.     virtual void            SetPort ( GrafPtr newPort );
  205.  
  206. protected:
  207.     QuicktimeMovieAnimatedIcon*    GetParent ( ) const { return (QuicktimeMovieAnimatedIcon*) mAnimatedIcon; };
  208. };
  209.  
  210. inline AnimatedIconOnScreen* QuicktimeMovieAnimatedIcon::GetNewAnimatedIconOnScreen ( GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform )
  211. {
  212.     return new QuicktimeMovieAnimatedIconOnScreen ( this, port, rect, align, transform );
  213. }
  214.  
  215. //    ============================================================================================
  216.  
  217. class PictureAnimatedIcon : public AnimatedIcon
  218. {
  219. public:
  220.     typedef struct PictureAnimatedIconResourceStruct
  221.     {
  222.         OSType            signature;
  223.         unsigned long    version;
  224.         
  225.         unsigned long    flags;
  226.  
  227.         short            pictureResID;        
  228.     } PictureAnimatedIconResourceStruct, *PictureAnimatedIconResourcePtr, **PictureAnimatedIconResourceHandle;
  229.  
  230.                         PictureAnimatedIcon ( void* iconSuiteToReplace, PictureAnimatedIconResourceHandle picInfoH );
  231.                         ~PictureAnimatedIcon ();
  232.  
  233.     virtual AnimatedIconOnScreen*    GetNewAnimatedIconOnScreen ( GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  234.                         
  235. protected:
  236.     friend class PictureAnimatedIconOnScreen;
  237.     PicHandle            mPictureH;
  238.     unsigned long        mPictureFlags;
  239. };
  240.  
  241. //    ============================================================================================
  242.  
  243. class PictureAnimatedIconOnScreen : public AnimatedIconOnScreen
  244. {
  245. public:
  246.                             PictureAnimatedIconOnScreen ( AnimatedIcon* animatedIcon, GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  247.                             ~PictureAnimatedIconOnScreen ( );
  248.                             
  249.     virtual OSErr            Draw ( const Rect* rect, IconAlignmentType align, IconTransformType transform );
  250.  
  251. protected:
  252.     PictureAnimatedIcon*    GetParent ( ) const { return (PictureAnimatedIcon*) mAnimatedIcon; };
  253. };
  254.  
  255. inline AnimatedIconOnScreen* PictureAnimatedIcon::GetNewAnimatedIconOnScreen ( GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform )
  256. {
  257.     return new PictureAnimatedIconOnScreen ( this, port, rect, align, transform );
  258. }
  259.  
  260. //    ============================================================================================
  261.  
  262. class SoundAnimatedIcon : public AnimatedIcon
  263. {
  264. public:
  265.     typedef struct SoundAnimatedIconResourceStruct
  266.     {
  267.         OSType            signature;
  268.         unsigned long    version;
  269.         
  270.         unsigned long    flags;
  271.  
  272.         short            soundResID;        
  273.         
  274.         unsigned long    minTimeBetweenSounds;
  275.         unsigned long    maxTimeBetweenSounds;
  276.     } SoundAnimatedIconResourceStruct, *SoundAnimatedIconResourcePtr, **SoundAnimatedIconResourceHandle;
  277.  
  278.                         SoundAnimatedIcon ( void* iconSuiteToReplace, SoundAnimatedIconResourceHandle soundInfoH );
  279.                         ~SoundAnimatedIcon ();
  280.  
  281.     SndListHandle        GetSoundH ( ) const { return mSoundH; };
  282.  
  283.     virtual AnimatedIconOnScreen*    GetNewAnimatedIconOnScreen ( GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  284.                         
  285. protected:
  286.     friend class SoundAnimatedIconOnScreen;
  287.     SndListHandle        mSoundH;
  288.     unsigned long        mSoundFlags;
  289.     
  290.     unsigned long        mMinTicksBetweenSounds;
  291.     unsigned long        mMaxTicksBetweenSounds;
  292. };
  293.  
  294. //    ============================================================================================
  295.  
  296. class SoundAnimatedIconOnScreen : public AnimatedIconOnScreen
  297. {
  298. public:
  299.                             SoundAnimatedIconOnScreen ( AnimatedIcon* animatedIcon, GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  300.                             ~SoundAnimatedIconOnScreen ( );
  301.                             
  302.     virtual OSErr            Draw ( const Rect* rect, IconAlignmentType align, IconTransformType transform );
  303.     virtual unsigned long    Idle ();
  304.     
  305. protected:
  306.     SoundAnimatedIcon*    GetParent ( ) const { return (SoundAnimatedIcon*) mAnimatedIcon; };
  307.     pascal void SoundAnimatedIconOnScreenSoundCallback ( SndChannelPtr soundChannel, SndCommand cmd );
  308.  
  309.     SndChannelPtr            mSoundChannel;
  310.     unsigned long            mNextTickToStartPlayingSound;
  311. };
  312.  
  313. inline AnimatedIconOnScreen* SoundAnimatedIcon::GetNewAnimatedIconOnScreen ( GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform )
  314. {
  315.     return new SoundAnimatedIconOnScreen ( this, port, rect, align, transform );
  316. }
  317.  
  318. //    ============================================================================================
  319.  
  320. class VoiceAnimatedIcon : public AnimatedIcon
  321. {
  322. public:
  323.     typedef struct VoiceAnimatedIconResourceStruct
  324.     {
  325.         OSType            signature;
  326.         unsigned long    version;
  327.         
  328.         unsigned long    flags;
  329.  
  330.         short            VoiceResID;        
  331.         
  332.         unsigned long    minTimeBetweenVoice;
  333.         unsigned long    maxTimeBetweenVoice;
  334.     } VoiceAnimatedIconResourceStruct, *VoiceAnimatedIconResourcePtr, **VoiceAnimatedIconResourceHandle;
  335.  
  336.                         VoiceAnimatedIcon ( void* iconSuiteToReplace, VoiceAnimatedIconResourceHandle VoiceInfoH, FSSpec* spec );
  337.                         ~VoiceAnimatedIcon ();
  338.  
  339.     Str255 **        GetVoiceH ( ) const { return mVoiceH; };
  340.  
  341.     virtual AnimatedIconOnScreen*    GetNewAnimatedIconOnScreen ( GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  342.                         
  343. protected:
  344.     friend class VoiceAnimatedIconOnScreen;
  345.     Str255 **            mVoiceH;
  346.     unsigned long        mVoiceFlags;
  347.     
  348.     unsigned long        mMinTicksBetweenVoice;
  349.     unsigned long        mMaxTicksBetweenVoice;
  350. };
  351.  
  352. //    ============================================================================================
  353.  
  354. class VoiceAnimatedIconOnScreen : public AnimatedIconOnScreen
  355. {
  356. public:
  357.                             VoiceAnimatedIconOnScreen ( AnimatedIcon* animatedIcon, GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform );
  358.                             ~VoiceAnimatedIconOnScreen ( );
  359.                             
  360.     virtual OSErr            Draw ( const Rect* rect, IconAlignmentType align, IconTransformType transform );
  361.     virtual unsigned long    Idle ();
  362.     
  363. protected:
  364.     VoiceAnimatedIcon*    GetParent ( ) const { return (VoiceAnimatedIcon*) mAnimatedIcon; };
  365.     //pascal void VoiceAnimatedIconOnScreenVoiceCallback ( SndChannelPtr VoiceChannel, SndCommand cmd );
  366.  
  367.     SpeechChannel            mVoiceChannel;
  368.     unsigned long            mNextTickToStartPlayingVoice;
  369. };
  370.  
  371. inline AnimatedIconOnScreen* VoiceAnimatedIcon::GetNewAnimatedIconOnScreen ( GrafPtr port, const Rect* rect, IconAlignmentType align, IconTransformType transform )
  372. {
  373.     return new VoiceAnimatedIconOnScreen ( this, port, rect, align, transform );
  374. }
  375.  
  376. //    ============================================================================================
  377.  
  378.